home *** CD-ROM | disk | FTP | other *** search
/ Amiga Collections: Panorama / Panorama - Disk 01 (1986-02-15)(Pacific North-West Amigas Club)[h AFL][b corrupt files].zip / Panorama - Disk 01 (1986-02-15)(Pacific North-West Amigas Club)[h AFL][b corrupt files].adf / fixobj.c < prev    next >
C/C++ Source or Header  |  1989-10-24  |  2KB  |  71 lines

  1. /* FIXOBJ : cleanup routine for Amiga Object files (c) 1985 John Hodgson
  2.  
  3.     Note : FIXOBJ attempts to remove last record filler by truncating all
  4.     information past the last HUNK_END, providing the HUNK_END sequence
  5.     is within the last 128-byte record. The algorithm used here could be
  6.     thwarted if end-of-file filler happens to contain a bogus HUNK_END, or
  7.     if a particular load file ends with anything besides HUNK_END.
  8.  */
  9.  
  10.  #include <lattice/stdio.h>
  11.  
  12.  /* constant definitions */
  13.  
  14.  #define MAX16 (0xffff)
  15.  #define REVHUNK_END (0xf203)
  16.  #define BYTEBITS (8)
  17.  #define ENDOFFSET (2)
  18.  
  19.  main(argc,argv)
  20.  int argc;
  21.  char *argv[];
  22.  {
  23.    FILE *rdptr,*wrtptr,*fopen();
  24.    int pos;
  25.    unsigned int media;
  26.    long ctr;
  27.  
  28.  
  29.    if (argc!=3) {
  30.      printf("Usage : fixobj srcfile destfile\n");
  31.      exit(0);
  32.    }
  33.    if ((rdptr=fopen(argv[1],"r"))==NULL) {
  34.      printf("Error opening file %s for reading.\n",argv[1]);
  35.      exit(0);
  36.    }
  37.  
  38.  /* search last record backwards for HUNK_END combo in reverse order */
  39.  
  40.    media=0;
  41.    for (ctr=-1;ctr>-128;ctr--) {
  42.  
  43.      /* simulate a 16-bit shift register for easy hunk check */
  44.  
  45.      media=(media<<BYTEBITS)&MAX16;
  46.      fseek(rdptr,ctr,ENDOFFSET);
  47.      media|=getc(rdptr);
  48.      if (media == REVHUNK_END) break;
  49.    }
  50.    if ((media!=REVHUNK_END) || ctr==-2) {
  51.      (ctr==-2) ? printf("No corrections made!\n"):
  52.                  printf("Invalid load format!\n");
  53.      fclose(rdptr);
  54.      exit(0);
  55.    }
  56.    if ((wrtptr=fopen(argv[2],"w"))==NULL) {
  57.      printf("Error opening file %s for writing.\n",argv[2]);
  58.      fclose(rdptr);
  59.      exit(0);
  60.    }
  61.  
  62.  /* duplicate file up to HUNK_END, inclusive */
  63.  
  64.    pos=ftell(rdptr)+1;
  65.    rewind(rdptr);
  66.  
  67.    for (ctr=0;ctr<pos;ctr++) putc(getc(rdptr),wrtptr);
  68.  
  69.    fclose(rdptr); fclose(wrtptr);
  70.  }
  71.